home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1998 November / Freeware November 1998.img / dist / fw_UDELxntp.idb / usr / freeware / src / xntp-3.4o-export / lib / msyslog.c.z / msyslog.c
C/C++ Source or Header  |  1998-01-21  |  2KB  |  112 lines

  1. /*
  2.  * msyslog - either send a message to the terminal or print it on
  3.  *         the standard output.
  4.  *
  5.  * Converted to use varargs, much better ... jks
  6.  */
  7. #include <stdio.h>
  8. #include <errno.h>
  9.  
  10. /* alternative, as Solaris 2.x defines __STDC__ as 0 in a largely standard
  11.    conforming environment
  12.    #if __STDC__ || (defined(SOLARIS) && defined(__STDC__))
  13. */
  14. #ifdef __STDC__
  15. #include <stdarg.h>
  16. #else
  17. #include <varargs.h>
  18. #endif
  19.  
  20. #include "ntp_types.h"
  21. #include "ntp_string.h"
  22. #include "ntp_stdlib.h"
  23. #include "ntp_syslog.h"
  24.  
  25. #undef syslog
  26.  
  27. int syslogit = 1;
  28. FILE *syslog_file = NULL;
  29.  
  30. extern    int errno;
  31. extern    char *progname;
  32.  
  33. #if defined(__STDC__)
  34. void msyslog(int level, char *fmt, ...)
  35. #else
  36. /*VARARGS*/
  37. void msyslog(va_alist)
  38.     va_dcl
  39. #endif
  40. {
  41. #ifndef __STDC__
  42.     int level;
  43.     char *fmt;
  44. #endif
  45.     va_list ap;
  46.     char buf[1025], nfmt[256], xerr[50];
  47.     const char *err;
  48.     register int c, l;
  49.     register char *n, *f, *prog;
  50. #if !defined(SYS_44BSD) && !defined(SYS_NETBSD)
  51.     extern int sys_nerr;
  52.     extern char *sys_errlist[];
  53. #endif
  54.     int olderrno;
  55.  
  56. #ifdef __STDC__
  57.     va_start(ap, fmt);
  58. #else
  59.     va_start(ap);
  60.  
  61.     level = va_arg(ap, int);
  62.     fmt = va_arg(ap, char *);
  63. #endif
  64.  
  65.     olderrno = errno;
  66.     n = nfmt;
  67.     f = fmt;
  68.     while ((c = *f++) != '\0' && c != '\n' && n < &nfmt[252]) {
  69.         if (c != '%') {
  70.             *n++ = c;
  71.             continue;
  72.         }
  73.         if ((c = *f++) != 'm') {
  74.             *n++ = '%';
  75.             *n++ = c;
  76.             continue;
  77.         }
  78.         if ((unsigned)olderrno > sys_nerr)
  79.             sprintf((char *)(err = xerr), "error %d", olderrno);
  80.         else
  81.             err = sys_errlist[olderrno];
  82.         if (n + (l = strlen(err)) < &nfmt[254]) {
  83.             strcpy(n, err);
  84.             n += strlen(err);
  85.         }
  86.     }
  87.     if (!syslogit)
  88.       *n++ = '\n';
  89.     *n = '\0';
  90.  
  91.     vsprintf(buf, nfmt, ap);
  92.     if (syslogit)
  93.         syslog(level, "%s", buf);
  94.     else {
  95.         extern char * humanlogtime P((void));
  96.  
  97.             FILE *out_file = syslog_file ? syslog_file
  98.                                         : level <= LOG_ERR ? stderr : stdout;
  99.               /* syslog() provides the timestamp, so if we're not using
  100.                  syslog, we must provide it. */
  101.         prog = strrchr(progname, '/');
  102.         if (prog == NULL)
  103.           prog = progname;
  104.         else
  105.           prog++;
  106.         (void) fprintf(out_file, "%s ", humanlogtime ());
  107.                 (void) fprintf(out_file, "%s[%d]: %s", prog, getpid(), buf);
  108.         fflush (out_file);
  109.     }
  110.     va_end(ap);
  111. }
  112.